package com.java.Collection.Set;

import java.util.*;

public class SetAPI {
    static class Inner {
        private String name;
        
        public Inner(String name) {
            this.name = name;
        }
        
        @Override
        public String toString() {
            return name;
        }
    }
    
    public static <T extends Set> T add(T t, Inner inner) {
        if (inner != null) {
            System.out.println(t.add(inner)); // true
            System.out.println(t.add(new Inner("_"))); // true
        }
        
        System.out.println(t.add("B")); // true
        System.out.println(t.add("B")); // false
        System.out.println(t.add("A")); // true
        return t;
    }
    
    public static <T extends Set> T addAll(T t) {
        System.out.println(t.addAll(Arrays.asList("B", "A"))); // false
        System.out.println(t.addAll(Arrays.asList("B", "A", "C"))); // true
        return t;
    }
    
    public static <T extends Set> T remove(T t, Inner inner) {
        if (inner != null) {
            System.out.println(t.remove(new Inner("_"))); // false
            System.out.println(t.remove(inner)); // true
        }
        
        System.out.println(t.remove("B")); // true
        return t;
    }
    
    public static <T extends Set> T removeAll(T t) {
        System.out.println(t.removeAll(Arrays.asList("C", "B"))); // true
        return t;
    }
    
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        TreeSet treeSet = new TreeSet();
        Inner inner = new Inner("_");
        
        // add：添加一个对象到集合，返回值表示原集合是否改变
        System.out.println(add(hashSet, inner)); // [A, B, _, _]
        System.out.println(add(linkedHashSet, inner)); // [_, _, B, A]
        System.out.println(add(treeSet, null)); // [A, B]
        
        // addAll：添加多个对象到集合，返回值表示原集合是否改变
        System.out.println(addAll(hashSet)); // [A, B, C, _, _]
        System.out.println(addAll(linkedHashSet)); // [_, _, B, A, C]
        System.out.println(addAll(treeSet)); // [A, B, C]
        
        // remove：移除集合内一个指定对象，若指定对象重复则移除第一个，返回值表示原集合是否改变
        System.out.println(remove(hashSet, inner)); // [A, C, _]
        System.out.println(remove(linkedHashSet, inner)); // [_, A, C]
        System.out.println(remove(treeSet, null)); // [A, C]
        
        // removeAll：移除集合内多个指定对象，返回值表示原集合是否改变
        System.out.println(removeAll(hashSet)); // [A, _]
        System.out.println(removeAll(linkedHashSet)); // [_, A]
        System.out.println(removeAll(treeSet)); // [A]
        
        // contains：判断集合内是否存在指定对象，重写hashCode和equals可自定义判断方式
        System.out.println(hashSet.contains("A")); // true
        System.out.println(linkedHashSet.contains("A")); // true
        System.out.println(treeSet.contains("A")); // true
        
        // containsAll：判断集合内是否存在所有指定对象，重写hashCode和equals可自定义判断方式
        System.out.println(hashSet.containsAll(Arrays.asList("A"))); // true
        System.out.println(hashSet.containsAll(Arrays.asList("A", "G"))); // false
        System.out.println(linkedHashSet.containsAll(Arrays.asList("A"))); // true
        System.out.println(linkedHashSet.containsAll(Arrays.asList("A", "G"))); // false
        System.out.println(treeSet.containsAll(Arrays.asList("A"))); // true
        System.out.println(treeSet.containsAll(Arrays.asList("A", "G"))); // false
        
        // retainAll：获取两集合的交集对象，返回值表示原集合是否改变
        System.out.println(hashSet.retainAll(Arrays.asList("C", "A", "B"))); // true
        System.out.println(hashSet); // [A]
        System.out.println(linkedHashSet.retainAll(Arrays.asList("C", "A", "B"))); // true
        System.out.println(linkedHashSet); // [A]
        System.out.println(treeSet.retainAll(Arrays.asList("C", "A", "B"))); // false
        System.out.println(treeSet); // [A]
        
        // isEmpty：判断集合内对象个数是否为空
        System.out.println(hashSet.isEmpty()); // false
        System.out.println(linkedHashSet.isEmpty()); // false
        System.out.println(treeSet.isEmpty()); // false
        
        // size：获取集合内对象总数
        System.out.println(hashSet.size()); // 1
        System.out.println(linkedHashSet.size()); // 1
        System.out.println(treeSet.size()); // 1
        
        // toArray：获取集合的数组形式
        System.out.println(hashSet.toArray()); // [Ljava.lang.Object;@14ae5a5
        System.out.println(linkedHashSet.toArray()); // [Ljava.lang.Object;@7f31245a
        System.out.println(treeSet.toArray()); // [Ljava.lang.Object;@6d6f6e28
        
        // clear：清空集合内所有对象，无返回值
        hashSet.clear();
        System.out.println(hashSet); // []
        linkedHashSet.clear();
        System.out.println(linkedHashSet); // []
        treeSet.clear();
        System.out.println(treeSet); // []
    }
}
